{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8fe19b15",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy\n",
    "import matplotlib.pyplot as plt\n",
    "from pandas import read_csv\n",
    "import math\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dense\n",
    "from keras.layers import LSTM\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from pandas import concat\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "d273afaa",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pandas import read_csv\n",
    "from datetime import datetime\n",
    "# load data\n",
    "dataset = read_csv('pu03_min.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8f931387",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    ����ʱ��  �й�������Сֵ��kw��  ��  ��.1  һ��ڼ���  һ��ڼ���.1  weekday  ����  \\\n",
      "0  2019/1/1          4093.0467   1     1        1          1        1     1   \n",
      "1  2019/1/2          3971.5308   1     2        2          1        2     1   \n",
      "2  2019/1/3          4033.8369   1     3        3          1        3     1   \n",
      "3  2019/1/4          4145.8497   1     4        4          1        4     1   \n",
      "4  2019/1/5          3965.1792   1     5        5          1        5     1   \n",
      "\n",
      "   �Ƿ��³�  �Ƿ���ĩ  �Ƿ񼾽ڳ�  �Ƿ񼾽�ĩ  �Ƿ���ĩ.1  ����״��  ����¶�  ����¶�.1  \\\n",
      "0       1       0      1      0         0      3.0    12.0       7.0   \n",
      "1       0       0      0      0         0      5.0    11.0       6.0   \n",
      "2       0       0      0      0         0      2.0    15.0       9.0   \n",
      "3       0       0      0      0         0      3.0    17.0      12.0   \n",
      "4       0       0      0      0         1      3.0    17.0      12.0   \n",
      "\n",
      "   �����������  ҹ����������  \n",
      "0         11.0          8.0  \n",
      "1         11.0          8.0  \n",
      "2         11.0          8.0  \n",
      "3         11.0          8.0  \n",
      "4         11.0          8.0  \n"
     ]
    }
   ],
   "source": [
    "print(dataset.head(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2543c3f1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# manually specify column names\n",
    "#dataset.drop('Unnamed: 0 ', axis=1, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "82c5bfba",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    ����ʱ��  �й�������Сֵ��kw��  ��  ��.1  һ��ڼ���  һ��ڼ���.1  weekday  ����  \\\n",
      "0  2019/1/1          4093.0467   1     1        1          1        1     1   \n",
      "1  2019/1/2          3971.5308   1     2        2          1        2     1   \n",
      "2  2019/1/3          4033.8369   1     3        3          1        3     1   \n",
      "3  2019/1/4          4145.8497   1     4        4          1        4     1   \n",
      "4  2019/1/5          3965.1792   1     5        5          1        5     1   \n",
      "\n",
      "   �Ƿ��³�  �Ƿ���ĩ  �Ƿ񼾽ڳ�  �Ƿ񼾽�ĩ  �Ƿ���ĩ.1  ����״��  ����¶�  ����¶�.1  \\\n",
      "0       1       0      1      0         0      3.0    12.0       7.0   \n",
      "1       0       0      0      0         0      5.0    11.0       6.0   \n",
      "2       0       0      0      0         0      2.0    15.0       9.0   \n",
      "3       0       0      0      0         0      3.0    17.0      12.0   \n",
      "4       0       0      0      0         1      3.0    17.0      12.0   \n",
      "\n",
      "   �����������  ҹ����������  \n",
      "0         11.0          8.0  \n",
      "1         11.0          8.0  \n",
      "2         11.0          8.0  \n",
      "3         11.0          8.0  \n",
      "4         11.0          8.0  \n"
     ]
    }
   ],
   "source": [
    "print(dataset.head(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b9af4d79",
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset.columns = ['数据时间','有功功率最大值（kw）','月','天','一年第几天','一年第几周','weekday','季节','是否月初','是否月末','是否季节初','是否季节末','是否周末','天气状况','最高温度','最低温度','白天风力风向','夜晚风力风向']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "7424ebc2",
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset.drop('数据时间', axis=1, inplace=True)\n",
    "# summarize first 5 rows\n",
    "#print(dataset.head(5))\n",
    "# save to file\n",
    "dataset.to_csv('power.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "3a01e663",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      有功功率最大值（kw）   月   天  一年第几天  一年第几周  weekday  季节  是否月初  是否月末  是否季节初  \\\n",
      "0      4093.04670   1   1      1      1        1   1     1     0      1   \n",
      "1      3971.53080   1   2      2      1        2   1     0     0      0   \n",
      "2      4033.83690   1   3      3      1        3   1     0     0      0   \n",
      "3      4145.84970   1   4      4      1        4   1     0     0      0   \n",
      "4      3965.17920   1   5      5      1        5   1     0     0      0   \n",
      "...           ...  ..  ..    ...    ...      ...  ..   ...   ...    ...   \n",
      "1060   2864.42112  11  26    330     47        4   4     0     0      0   \n",
      "1061   2778.12696  11  27    331     47        5   4     0     0      0   \n",
      "1062   2705.32380  11  28    332     47        6   4     0     0      0   \n",
      "1063   2537.99844  11  29    333     48        0   4     0     0      0   \n",
      "1064   2661.78228  11  30    334     48        1   4     0     1      0   \n",
      "\n",
      "      是否季节末  是否周末  天气状况   最高温度   最低温度  白天风力风向  夜晚风力风向  \n",
      "0         0     0  3.00  12.00   7.00   11.00    8.00  \n",
      "1         0     0  5.00  11.00   6.00   11.00    8.00  \n",
      "2         0     0  2.00  15.00   9.00   11.00    8.00  \n",
      "3         0     0  3.00  17.00  12.00   11.00    8.00  \n",
      "4         0     1  3.00  17.00  12.00   11.00    8.00  \n",
      "...     ...   ...   ...    ...    ...     ...     ...  \n",
      "1060      0     0  2.00  25.80  16.35   15.20   12.20  \n",
      "1061      0     1  2.00  23.65  15.30   19.40   16.40  \n",
      "1062      0     1  1.15  21.40  13.50   21.15   18.15  \n",
      "1063      0     0  1.85  22.05  13.65   15.20   12.20  \n",
      "1064      0     0  1.15  22.50  14.20   20.40   17.40  \n",
      "\n",
      "[1065 rows x 17 columns]\n"
     ]
    }
   ],
   "source": [
    "print(dataset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "4c4e13a4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<bound method NDFrame.head of       var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)  var5(t-1)  var6(t-1)  \\\n",
      "1      0.677283   0.000000   0.000000   0.000000   0.000000   0.166667   \n",
      "2      0.661483   0.000000   0.033333   0.002740   0.000000   0.333333   \n",
      "3      0.669584   0.000000   0.066667   0.005479   0.000000   0.500000   \n",
      "4      0.684148   0.000000   0.100000   0.008219   0.000000   0.666667   \n",
      "5      0.660657   0.000000   0.133333   0.010959   0.000000   0.833333   \n",
      "...         ...        ...        ...        ...        ...        ...   \n",
      "1060   0.493649   0.909091   0.800000   0.898630   0.884615   0.500000   \n",
      "1061   0.517535   0.909091   0.833333   0.901370   0.884615   0.666667   \n",
      "1062   0.506315   0.909091   0.866667   0.904110   0.884615   0.833333   \n",
      "1063   0.496849   0.909091   0.900000   0.906849   0.884615   1.000000   \n",
      "1064   0.475093   0.909091   0.933333   0.909589   0.903846   0.000000   \n",
      "\n",
      "      var7(t-1)  var8(t-1)  var9(t-1)  var10(t-1)  var11(t-1)  var12(t-1)  \\\n",
      "1           0.0        1.0        0.0         1.0         0.0         0.0   \n",
      "2           0.0        0.0        0.0         0.0         0.0         0.0   \n",
      "3           0.0        0.0        0.0         0.0         0.0         0.0   \n",
      "4           0.0        0.0        0.0         0.0         0.0         0.0   \n",
      "5           0.0        0.0        0.0         0.0         0.0         1.0   \n",
      "...         ...        ...        ...         ...         ...         ...   \n",
      "1060        1.0        0.0        0.0         0.0         0.0         0.0   \n",
      "1061        1.0        0.0        0.0         0.0         0.0         0.0   \n",
      "1062        1.0        0.0        0.0         0.0         0.0         1.0   \n",
      "1063        1.0        0.0        0.0         0.0         0.0         1.0   \n",
      "1064        1.0        0.0        0.0         0.0         0.0         0.0   \n",
      "\n",
      "      var13(t-1)  var14(t-1)  var15(t-1)  var16(t-1)  var17(t-1)   var1(t)  \n",
      "1        0.25000    0.071429    0.153846    0.000000    0.000000  0.661483  \n",
      "2        0.50000    0.035714    0.115385    0.000000    0.000000  0.669584  \n",
      "3        0.12500    0.178571    0.230769    0.000000    0.000000  0.684148  \n",
      "4        0.25000    0.250000    0.346154    0.000000    0.000000  0.660657  \n",
      "5        0.25000    0.250000    0.346154    0.000000    0.000000  0.647683  \n",
      "...          ...         ...         ...         ...         ...       ...  \n",
      "1060     0.11250    0.594643    0.569231    0.634375    0.634375  0.517535  \n",
      "1061     0.12500    0.564286    0.513462    0.262500    0.262500  0.506315  \n",
      "1062     0.12500    0.487500    0.473077    0.525000    0.525000  0.496849  \n",
      "1063     0.01875    0.407143    0.403846    0.634375    0.634375  0.475093  \n",
      "1064     0.10625    0.430357    0.409615    0.262500    0.262500  0.491188  \n",
      "\n",
      "[1064 rows x 18 columns]>\n"
     ]
    }
   ],
   "source": [
    "# prepare data for lstm\n",
    "from pandas import DataFrame\n",
    "from pandas import concat\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "\n",
    "# convert series to supervised learning\n",
    "def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):\n",
    "    n_vars = 1 if type(data) is list else data.shape[1]\n",
    "    df = DataFrame(data)\n",
    "    cols, names = list(), list()\n",
    "    # input sequence (t-n, ... t-1)\n",
    "    for i in range(n_in, 0, -1):\n",
    "        cols.append(df.shift(i))\n",
    "        names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]\n",
    "    # forecast sequence (t, t+1, ... t+n)\n",
    "    for i in range(0, n_out):\n",
    "        cols.append(df.shift(-i))\n",
    "        if i == 0:\n",
    "            names += [('var%d(t)' % (j+1)) for j in range(n_vars)]\n",
    "        else:\n",
    "            names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]\n",
    "    # put it all together\n",
    "    agg = concat(cols, axis=1)\n",
    "    agg.columns = names\n",
    "    # drop rows with NaN values\n",
    "    if dropnan:\n",
    "        agg.dropna(inplace=True)\n",
    "    return agg\n",
    "\n",
    "# load dataset\n",
    "dataset = read_csv('power.csv', header=0, index_col=0)\n",
    "values = dataset.values\n",
    "# integer encode direction\n",
    "encoder = LabelEncoder()\n",
    "values[:,4] = encoder.fit_transform(values[:,4])\n",
    "# ensure all data is float\n",
    "values = values.astype('float32')\n",
    "# normalize features\n",
    "scaler = MinMaxScaler(feature_range=(0, 1))\n",
    "scaled = scaler.fit_transform(values)\n",
    "# frame as supervised learning\n",
    "reframed = series_to_supervised(scaled, 1, 1)\n",
    "# drop columns we don't want to predict\n",
    "reframed.drop(reframed.columns[[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33]], axis=1, inplace=True)\n",
    "#print(reframed.head())\n",
    "print(reframed.head)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "31d34811",
   "metadata": {},
   "outputs": [],
   "source": [
    "#plt.plot(reframed)\n",
    "#plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b8a051ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(973, 1, 17) (973,) (91, 1, 17) (91,)\n"
     ]
    }
   ],
   "source": [
    "...\n",
    "# split into train and test sets\n",
    "values = reframed.values\n",
    "n_train_hours = int(len(reframed)-91)\n",
    "train = values[:n_train_hours, :]\n",
    "test = values[n_train_hours:, :]\n",
    "# split into input and outputs\n",
    "train_X, train_y = train[:, :-1], train[:, -1]\n",
    "test_X, test_y = test[:, :-1], test[:, -1]\n",
    "# reshape input to be 3D [samples, timesteps, features]\n",
    "train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))\n",
    "test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))\n",
    "print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f1dfb13d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "14/14 - 1s - loss: 0.5177 - val_loss: 0.3840 - 1s/epoch - 94ms/step\n",
      "Epoch 2/100\n",
      "14/14 - 0s - loss: 0.2991 - val_loss: 0.1093 - 27ms/epoch - 2ms/step\n",
      "Epoch 3/100\n",
      "14/14 - 0s - loss: 0.2018 - val_loss: 0.1302 - 28ms/epoch - 2ms/step\n",
      "Epoch 4/100\n",
      "14/14 - 0s - loss: 0.1526 - val_loss: 0.1166 - 27ms/epoch - 2ms/step\n",
      "Epoch 5/100\n",
      "14/14 - 0s - loss: 0.1274 - val_loss: 0.0846 - 28ms/epoch - 2ms/step\n",
      "Epoch 6/100\n",
      "14/14 - 0s - loss: 0.1177 - val_loss: 0.0760 - 31ms/epoch - 2ms/step\n",
      "Epoch 7/100\n",
      "14/14 - 0s - loss: 0.1084 - val_loss: 0.0744 - 29ms/epoch - 2ms/step\n",
      "Epoch 8/100\n",
      "14/14 - 0s - loss: 0.0967 - val_loss: 0.0701 - 30ms/epoch - 2ms/step\n",
      "Epoch 9/100\n",
      "14/14 - 0s - loss: 0.0886 - val_loss: 0.0660 - 32ms/epoch - 2ms/step\n",
      "Epoch 10/100\n",
      "14/14 - 0s - loss: 0.0826 - val_loss: 0.0625 - 31ms/epoch - 2ms/step\n",
      "Epoch 11/100\n",
      "14/14 - 0s - loss: 0.0783 - val_loss: 0.0593 - 31ms/epoch - 2ms/step\n",
      "Epoch 12/100\n",
      "14/14 - 0s - loss: 0.0754 - val_loss: 0.0566 - 31ms/epoch - 2ms/step\n",
      "Epoch 13/100\n",
      "14/14 - 0s - loss: 0.0728 - val_loss: 0.0541 - 32ms/epoch - 2ms/step\n",
      "Epoch 14/100\n",
      "14/14 - 0s - loss: 0.0708 - val_loss: 0.0521 - 31ms/epoch - 2ms/step\n",
      "Epoch 15/100\n",
      "14/14 - 0s - loss: 0.0690 - val_loss: 0.0504 - 30ms/epoch - 2ms/step\n",
      "Epoch 16/100\n",
      "14/14 - 0s - loss: 0.0673 - val_loss: 0.0494 - 31ms/epoch - 2ms/step\n",
      "Epoch 17/100\n",
      "14/14 - 0s - loss: 0.0660 - val_loss: 0.0484 - 30ms/epoch - 2ms/step\n",
      "Epoch 18/100\n",
      "14/14 - 0s - loss: 0.0647 - val_loss: 0.0474 - 30ms/epoch - 2ms/step\n",
      "Epoch 19/100\n",
      "14/14 - 0s - loss: 0.0634 - val_loss: 0.0469 - 29ms/epoch - 2ms/step\n",
      "Epoch 20/100\n",
      "14/14 - 0s - loss: 0.0624 - val_loss: 0.0465 - 32ms/epoch - 2ms/step\n",
      "Epoch 21/100\n",
      "14/14 - 0s - loss: 0.0616 - val_loss: 0.0457 - 30ms/epoch - 2ms/step\n",
      "Epoch 22/100\n",
      "14/14 - 0s - loss: 0.0607 - val_loss: 0.0453 - 30ms/epoch - 2ms/step\n",
      "Epoch 23/100\n",
      "14/14 - 0s - loss: 0.0603 - val_loss: 0.0446 - 30ms/epoch - 2ms/step\n",
      "Epoch 24/100\n",
      "14/14 - 0s - loss: 0.0597 - val_loss: 0.0436 - 29ms/epoch - 2ms/step\n",
      "Epoch 25/100\n",
      "14/14 - 0s - loss: 0.0586 - val_loss: 0.0437 - 30ms/epoch - 2ms/step\n",
      "Epoch 26/100\n",
      "14/14 - 0s - loss: 0.0584 - val_loss: 0.0433 - 30ms/epoch - 2ms/step\n",
      "Epoch 27/100\n",
      "14/14 - 0s - loss: 0.0579 - val_loss: 0.0422 - 28ms/epoch - 2ms/step\n",
      "Epoch 28/100\n",
      "14/14 - 0s - loss: 0.0571 - val_loss: 0.0421 - 30ms/epoch - 2ms/step\n",
      "Epoch 29/100\n",
      "14/14 - 0s - loss: 0.0567 - val_loss: 0.0443 - 29ms/epoch - 2ms/step\n",
      "Epoch 30/100\n",
      "14/14 - 0s - loss: 0.0571 - val_loss: 0.0419 - 28ms/epoch - 2ms/step\n",
      "Epoch 31/100\n",
      "14/14 - 0s - loss: 0.0562 - val_loss: 0.0400 - 29ms/epoch - 2ms/step\n",
      "Epoch 32/100\n",
      "14/14 - 0s - loss: 0.0549 - val_loss: 0.0419 - 28ms/epoch - 2ms/step\n",
      "Epoch 33/100\n",
      "14/14 - 0s - loss: 0.0553 - val_loss: 0.0453 - 27ms/epoch - 2ms/step\n",
      "Epoch 34/100\n",
      "14/14 - 0s - loss: 0.0560 - val_loss: 0.0409 - 29ms/epoch - 2ms/step\n",
      "Epoch 35/100\n",
      "14/14 - 0s - loss: 0.0547 - val_loss: 0.0391 - 30ms/epoch - 2ms/step\n",
      "Epoch 36/100\n",
      "14/14 - 0s - loss: 0.0530 - val_loss: 0.0437 - 31ms/epoch - 2ms/step\n",
      "Epoch 37/100\n",
      "14/14 - 0s - loss: 0.0555 - val_loss: 0.0483 - 31ms/epoch - 2ms/step\n",
      "Epoch 38/100\n",
      "14/14 - 0s - loss: 0.0558 - val_loss: 0.0384 - 30ms/epoch - 2ms/step\n",
      "Epoch 39/100\n",
      "14/14 - 0s - loss: 0.0542 - val_loss: 0.0384 - 31ms/epoch - 2ms/step\n",
      "Epoch 40/100\n",
      "14/14 - 0s - loss: 0.0522 - val_loss: 0.0563 - 29ms/epoch - 2ms/step\n",
      "Epoch 41/100\n",
      "14/14 - 0s - loss: 0.0620 - val_loss: 0.0431 - 31ms/epoch - 2ms/step\n",
      "Epoch 42/100\n",
      "14/14 - 0s - loss: 0.0562 - val_loss: 0.0416 - 32ms/epoch - 2ms/step\n",
      "Epoch 43/100\n",
      "14/14 - 0s - loss: 0.0566 - val_loss: 0.0416 - 31ms/epoch - 2ms/step\n",
      "Epoch 44/100\n",
      "14/14 - 0s - loss: 0.0588 - val_loss: 0.0581 - 30ms/epoch - 2ms/step\n",
      "Epoch 45/100\n",
      "14/14 - 0s - loss: 0.0633 - val_loss: 0.0373 - 31ms/epoch - 2ms/step\n",
      "Epoch 46/100\n",
      "14/14 - 0s - loss: 0.0523 - val_loss: 0.0381 - 31ms/epoch - 2ms/step\n",
      "Epoch 47/100\n",
      "14/14 - 0s - loss: 0.0512 - val_loss: 0.0557 - 30ms/epoch - 2ms/step\n",
      "Epoch 48/100\n",
      "14/14 - 0s - loss: 0.0597 - val_loss: 0.0410 - 30ms/epoch - 2ms/step\n",
      "Epoch 49/100\n",
      "14/14 - 0s - loss: 0.0531 - val_loss: 0.0386 - 31ms/epoch - 2ms/step\n",
      "Epoch 50/100\n",
      "14/14 - 0s - loss: 0.0532 - val_loss: 0.0397 - 33ms/epoch - 2ms/step\n",
      "Epoch 51/100\n",
      "14/14 - 0s - loss: 0.0548 - val_loss: 0.0585 - 32ms/epoch - 2ms/step\n",
      "Epoch 52/100\n",
      "14/14 - 0s - loss: 0.0603 - val_loss: 0.0361 - 33ms/epoch - 2ms/step\n",
      "Epoch 53/100\n",
      "14/14 - 0s - loss: 0.0496 - val_loss: 0.0369 - 30ms/epoch - 2ms/step\n",
      "Epoch 54/100\n",
      "14/14 - 0s - loss: 0.0496 - val_loss: 0.0502 - 32ms/epoch - 2ms/step\n",
      "Epoch 55/100\n",
      "14/14 - 0s - loss: 0.0578 - val_loss: 0.0449 - 32ms/epoch - 2ms/step\n",
      "Epoch 56/100\n",
      "14/14 - 0s - loss: 0.0536 - val_loss: 0.0366 - 31ms/epoch - 2ms/step\n",
      "Epoch 57/100\n",
      "14/14 - 0s - loss: 0.0516 - val_loss: 0.0371 - 31ms/epoch - 2ms/step\n",
      "Epoch 58/100\n",
      "14/14 - 0s - loss: 0.0511 - val_loss: 0.0607 - 32ms/epoch - 2ms/step\n",
      "Epoch 59/100\n",
      "14/14 - 0s - loss: 0.0606 - val_loss: 0.0373 - 33ms/epoch - 2ms/step\n",
      "Epoch 60/100\n",
      "14/14 - 0s - loss: 0.0494 - val_loss: 0.0387 - 33ms/epoch - 2ms/step\n",
      "Epoch 61/100\n",
      "14/14 - 0s - loss: 0.0508 - val_loss: 0.0376 - 32ms/epoch - 2ms/step\n",
      "Epoch 62/100\n",
      "14/14 - 0s - loss: 0.0526 - val_loss: 0.0608 - 36ms/epoch - 3ms/step\n",
      "Epoch 63/100\n",
      "14/14 - 0s - loss: 0.0594 - val_loss: 0.0357 - 31ms/epoch - 2ms/step\n",
      "Epoch 64/100\n",
      "14/14 - 0s - loss: 0.0476 - val_loss: 0.0367 - 31ms/epoch - 2ms/step\n",
      "Epoch 65/100\n",
      "14/14 - 0s - loss: 0.0484 - val_loss: 0.0395 - 31ms/epoch - 2ms/step\n",
      "Epoch 66/100\n",
      "14/14 - 0s - loss: 0.0534 - val_loss: 0.0539 - 30ms/epoch - 2ms/step\n",
      "Epoch 67/100\n",
      "14/14 - 0s - loss: 0.0561 - val_loss: 0.0347 - 33ms/epoch - 2ms/step\n",
      "Epoch 68/100\n",
      "14/14 - 0s - loss: 0.0473 - val_loss: 0.0360 - 31ms/epoch - 2ms/step\n",
      "Epoch 69/100\n",
      "14/14 - 0s - loss: 0.0480 - val_loss: 0.0514 - 31ms/epoch - 2ms/step\n",
      "Epoch 70/100\n",
      "14/14 - 0s - loss: 0.0573 - val_loss: 0.0410 - 31ms/epoch - 2ms/step\n",
      "Epoch 71/100\n",
      "14/14 - 0s - loss: 0.0504 - val_loss: 0.0360 - 31ms/epoch - 2ms/step\n",
      "Epoch 72/100\n",
      "14/14 - 0s - loss: 0.0492 - val_loss: 0.0350 - 31ms/epoch - 2ms/step\n",
      "Epoch 73/100\n",
      "14/14 - 0s - loss: 0.0494 - val_loss: 0.0621 - 30ms/epoch - 2ms/step\n",
      "Epoch 74/100\n",
      "14/14 - 0s - loss: 0.0598 - val_loss: 0.0344 - 32ms/epoch - 2ms/step\n",
      "Epoch 75/100\n",
      "14/14 - 0s - loss: 0.0465 - val_loss: 0.0373 - 31ms/epoch - 2ms/step\n",
      "Epoch 76/100\n",
      "14/14 - 0s - loss: 0.0478 - val_loss: 0.0376 - 30ms/epoch - 2ms/step\n",
      "Epoch 77/100\n",
      "14/14 - 0s - loss: 0.0509 - val_loss: 0.0557 - 32ms/epoch - 2ms/step\n",
      "Epoch 78/100\n",
      "14/14 - 0s - loss: 0.0557 - val_loss: 0.0347 - 31ms/epoch - 2ms/step\n",
      "Epoch 79/100\n",
      "14/14 - 0s - loss: 0.0454 - val_loss: 0.0355 - 30ms/epoch - 2ms/step\n",
      "Epoch 80/100\n",
      "14/14 - 0s - loss: 0.0460 - val_loss: 0.0415 - 30ms/epoch - 2ms/step\n",
      "Epoch 81/100\n",
      "14/14 - 0s - loss: 0.0528 - val_loss: 0.0479 - 31ms/epoch - 2ms/step\n",
      "Epoch 82/100\n",
      "14/14 - 0s - loss: 0.0517 - val_loss: 0.0342 - 31ms/epoch - 2ms/step\n",
      "Epoch 83/100\n",
      "14/14 - 0s - loss: 0.0453 - val_loss: 0.0350 - 31ms/epoch - 2ms/step\n",
      "Epoch 84/100\n",
      "14/14 - 0s - loss: 0.0458 - val_loss: 0.0526 - 31ms/epoch - 2ms/step\n",
      "Epoch 85/100\n",
      "14/14 - 0s - loss: 0.0568 - val_loss: 0.0368 - 29ms/epoch - 2ms/step\n",
      "Epoch 86/100\n",
      "14/14 - 0s - loss: 0.0469 - val_loss: 0.0367 - 32ms/epoch - 2ms/step\n",
      "Epoch 87/100\n",
      "14/14 - 0s - loss: 0.0469 - val_loss: 0.0346 - 29ms/epoch - 2ms/step\n",
      "Epoch 88/100\n",
      "14/14 - 0s - loss: 0.0485 - val_loss: 0.0607 - 31ms/epoch - 2ms/step\n",
      "Epoch 89/100\n",
      "14/14 - 0s - loss: 0.0576 - val_loss: 0.0343 - 30ms/epoch - 2ms/step\n",
      "Epoch 90/100\n",
      "14/14 - 0s - loss: 0.0445 - val_loss: 0.0363 - 29ms/epoch - 2ms/step\n",
      "Epoch 91/100\n",
      "14/14 - 0s - loss: 0.0461 - val_loss: 0.0354 - 30ms/epoch - 2ms/step\n",
      "Epoch 92/100\n",
      "14/14 - 0s - loss: 0.0488 - val_loss: 0.0564 - 30ms/epoch - 2ms/step\n",
      "Epoch 93/100\n",
      "14/14 - 0s - loss: 0.0557 - val_loss: 0.0341 - 28ms/epoch - 2ms/step\n",
      "Epoch 94/100\n",
      "14/14 - 0s - loss: 0.0440 - val_loss: 0.0354 - 28ms/epoch - 2ms/step\n",
      "Epoch 95/100\n",
      "14/14 - 0s - loss: 0.0449 - val_loss: 0.0387 - 33ms/epoch - 2ms/step\n",
      "Epoch 96/100\n",
      "14/14 - 0s - loss: 0.0501 - val_loss: 0.0499 - 28ms/epoch - 2ms/step\n",
      "Epoch 97/100\n",
      "14/14 - 0s - loss: 0.0516 - val_loss: 0.0338 - 29ms/epoch - 2ms/step\n",
      "Epoch 98/100\n",
      "14/14 - 0s - loss: 0.0445 - val_loss: 0.0362 - 30ms/epoch - 2ms/step\n",
      "Epoch 99/100\n",
      "14/14 - 0s - loss: 0.0454 - val_loss: 0.0494 - 29ms/epoch - 2ms/step\n",
      "Epoch 100/100\n",
      "14/14 - 0s - loss: 0.0565 - val_loss: 0.0364 - 31ms/epoch - 2ms/step\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "...\n",
    "# design network\n",
    "model = Sequential()\n",
    "model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))\n",
    "model.add(Dense(1))\n",
    "model.compile(loss='mae', optimizer='adam')\n",
    "# fit network\n",
    "history = model.fit(train_X, train_y, epochs=100, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)\n",
    "# plot history\n",
    "plt.plot(history.history['loss'], label='train')\n",
    "plt.plot(history.history['val_loss'], label='test')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "64a0d2b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# make predictions\n",
    "#trainPredict = model.predict(train_X)\n",
    "#testPredict = model.predict(test_X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7c7a3607",
   "metadata": {},
   "outputs": [],
   "source": [
    "...\n",
    "# make a prediction\n",
    "yhat = model.predict(test_X)\n",
    "test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "2e095d4f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(91, 1) (91, 17)\n"
     ]
    }
   ],
   "source": [
    "yhat=DataFrame(yhat)\n",
    "test_X=DataFrame(test_X)\n",
    "print(yhat.shape,test_X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f5b552e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.615346</td>\n",
       "      <td>0.636364</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.663014</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.166667</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>0.785714</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>0.875000</td>\n",
       "      <td>0.875000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.699265</td>\n",
       "      <td>0.727273</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.665753</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.34375</td>\n",
       "      <td>0.864286</td>\n",
       "      <td>0.909615</td>\n",
       "      <td>0.525000</td>\n",
       "      <td>0.525000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.712656</td>\n",
       "      <td>0.727273</td>\n",
       "      <td>0.033333</td>\n",
       "      <td>0.668493</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.41250</td>\n",
       "      <td>0.857143</td>\n",
       "      <td>0.898077</td>\n",
       "      <td>0.525000</td>\n",
       "      <td>0.525000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.734066</td>\n",
       "      <td>0.727273</td>\n",
       "      <td>0.066667</td>\n",
       "      <td>0.671233</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.34375</td>\n",
       "      <td>0.867857</td>\n",
       "      <td>0.905769</td>\n",
       "      <td>0.525000</td>\n",
       "      <td>0.525000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.737423</td>\n",
       "      <td>0.727273</td>\n",
       "      <td>0.100000</td>\n",
       "      <td>0.673973</td>\n",
       "      <td>0.653846</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.23125</td>\n",
       "      <td>0.860714</td>\n",
       "      <td>0.898077</td>\n",
       "      <td>0.587500</td>\n",
       "      <td>0.587500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>86</th>\n",
       "      <td>0.479876</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>0.898630</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.11250</td>\n",
       "      <td>0.594643</td>\n",
       "      <td>0.569231</td>\n",
       "      <td>0.634375</td>\n",
       "      <td>0.634375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87</th>\n",
       "      <td>0.490798</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>0.901370</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.12500</td>\n",
       "      <td>0.564286</td>\n",
       "      <td>0.513462</td>\n",
       "      <td>0.262500</td>\n",
       "      <td>0.262500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>88</th>\n",
       "      <td>0.492089</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.866667</td>\n",
       "      <td>0.904110</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>0.833333</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.12500</td>\n",
       "      <td>0.487500</td>\n",
       "      <td>0.473077</td>\n",
       "      <td>0.525000</td>\n",
       "      <td>0.525000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>89</th>\n",
       "      <td>0.467695</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.900000</td>\n",
       "      <td>0.906849</td>\n",
       "      <td>0.884615</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.01875</td>\n",
       "      <td>0.407143</td>\n",
       "      <td>0.403846</td>\n",
       "      <td>0.634375</td>\n",
       "      <td>0.634375</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90</th>\n",
       "      <td>0.482792</td>\n",
       "      <td>0.909091</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.909589</td>\n",
       "      <td>0.903846</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.10625</td>\n",
       "      <td>0.430357</td>\n",
       "      <td>0.409615</td>\n",
       "      <td>0.262500</td>\n",
       "      <td>0.262500</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>91 rows × 17 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1         2         3         4         5         6    7   \\\n",
       "0   0.615346  0.636364  1.000000  0.663014  0.653846  0.166667  0.666667  0.0   \n",
       "1   0.699265  0.727273  0.000000  0.665753  0.653846  0.333333  0.666667  1.0   \n",
       "2   0.712656  0.727273  0.033333  0.668493  0.653846  0.500000  0.666667  0.0   \n",
       "3   0.734066  0.727273  0.066667  0.671233  0.653846  0.666667  0.666667  0.0   \n",
       "4   0.737423  0.727273  0.100000  0.673973  0.653846  0.833333  0.666667  0.0   \n",
       "..       ...       ...       ...       ...       ...       ...       ...  ...   \n",
       "86  0.479876  0.909091  0.800000  0.898630  0.884615  0.500000  1.000000  0.0   \n",
       "87  0.490798  0.909091  0.833333  0.901370  0.884615  0.666667  1.000000  0.0   \n",
       "88  0.492089  0.909091  0.866667  0.904110  0.884615  0.833333  1.000000  0.0   \n",
       "89  0.467695  0.909091  0.900000  0.906849  0.884615  1.000000  1.000000  0.0   \n",
       "90  0.482792  0.909091  0.933333  0.909589  0.903846  0.000000  1.000000  0.0   \n",
       "\n",
       "     8    9    10   11       12        13        14        15        16  \n",
       "0   1.0  0.0  0.0  0.0  1.00000  0.785714  0.884615  0.875000  0.875000  \n",
       "1   0.0  0.0  0.0  0.0  0.34375  0.864286  0.909615  0.525000  0.525000  \n",
       "2   0.0  0.0  0.0  0.0  0.41250  0.857143  0.898077  0.525000  0.525000  \n",
       "3   0.0  0.0  0.0  0.0  0.34375  0.867857  0.905769  0.525000  0.525000  \n",
       "4   0.0  0.0  0.0  1.0  0.23125  0.860714  0.898077  0.587500  0.587500  \n",
       "..  ...  ...  ...  ...      ...       ...       ...       ...       ...  \n",
       "86  0.0  0.0  0.0  0.0  0.11250  0.594643  0.569231  0.634375  0.634375  \n",
       "87  0.0  0.0  0.0  0.0  0.12500  0.564286  0.513462  0.262500  0.262500  \n",
       "88  0.0  0.0  0.0  1.0  0.12500  0.487500  0.473077  0.525000  0.525000  \n",
       "89  0.0  0.0  0.0  1.0  0.01875  0.407143  0.403846  0.634375  0.634375  \n",
       "90  0.0  0.0  0.0  0.0  0.10625  0.430357  0.409615  0.262500  0.262500  \n",
       "\n",
       "[91 rows x 17 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_X[0]=yhat\n",
    "test_X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "02cb65cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "inv_yhat = scaler.inverse_transform(test_X)\n",
    "inv_yhat = inv_yhat[:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "887968dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# invert scaling for actual\n",
    "test_y = test_y.reshape((len(test_y), 1))\n",
    "test_X[0]=test_y\n",
    "inv_y = scaler.inverse_transform(test_X)\n",
    "inv_y = inv_y[:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "64783e5b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test Score: 473.717\n"
     ]
    }
   ],
   "source": [
    "# calculate RMSE\n",
    "from math import sqrt\n",
    "#trainScore = sqrt(mean_squared_error(train_y[0], inv_yhat[0]))\n",
    "#print('Train Score: %.3f RMSE' % (trainScore))\n",
    "rmse2 = sqrt(mean_squared_error(inv_y, inv_yhat))\n",
    "print('Test Score: %.3f' % rmse2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1c22321c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4519.8525, 4669.1987, 4995.6973, 4930.922 , 4511.5337, 4438.9814,\n",
       "       4894.872 , 2233.5771, 5096.3877, 5132.4443, 5364.108 , 4840.1733,\n",
       "       4191.708 , 4574.515 , 4424.0864, 4733.0527, 4782.568 , 4801.57  ,\n",
       "       4350.203 , 4126.3228, 4288.61  , 4186.677 , 4555.493 , 4105.072 ,\n",
       "       3899.8284, 4088.8481, 3902.826 , 3730.902 , 3954.7568, 3937.8962,\n",
       "       3415.2312, 3396.5232, 3476.318 , 3672.9448, 3777.6409, 3655.0312,\n",
       "       3306.7446, 3461.3906, 3488.9626, 3485.5112, 3437.4106, 3988.191 ,\n",
       "       3623.6467, 3742.2527, 3639.6833, 3664.558 , 3349.843 , 3187.0513,\n",
       "       3198.3413, 3167.921 , 3260.2405, 3135.1594, 3165.3584, 3182.0105,\n",
       "       3177.5835, 3156.4656, 3174.3347, 3306.4333, 3103.885 , 3036.8018,\n",
       "       2858.8958, 2991.9043, 3085.9417, 3210.0303, 3071.8254, 3048.1772,\n",
       "       3040.6968, 2963.6184, 2874.9722, 1846.2236, 2771.038 , 2717.0747,\n",
       "       2871.6826, 2908.727 , 2763.2224, 2727.3704, 2753.0125, 2842.2056,\n",
       "       2899.2993, 3056.1892, 2564.3352, 2320.6428, 2884.3318, 2837.8865,\n",
       "       2649.4255, 2680.714 , 2864.4211, 2778.1267, 2705.3235, 2537.9985,\n",
       "       2661.7822], dtype=float32)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inv_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "227db62c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "91 91\n"
     ]
    }
   ],
   "source": [
    "print(len(inv_y),len(inv_yhat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a388d8c6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3616.6895, 4262.1104, 4365.1016, 4529.7637, 4555.5884, 4226.762 ,\n",
       "       4407.1426, 4642.597 , 2699.761 , 4622.547 , 4559.274 , 4894.59  ,\n",
       "       4419.991 , 4168.9717, 4406.1978, 4155.0747, 4281.5576, 4241.734 ,\n",
       "       4383.855 , 4033.6226, 4054.5176, 4151.4155, 3957.2153, 4101.3193,\n",
       "       3698.919 , 3726.884 , 3766.6072, 3816.94  , 3661.0195, 3709.8777,\n",
       "       3778.4832, 3012.503 , 3333.7102, 3336.0088, 3725.633 , 3710.478 ,\n",
       "       3479.7114, 3151.4417, 3228.3433, 3299.14  , 3248.4102, 3431.3623,\n",
       "       3723.8801, 3365.4985, 3319.0215, 3250.6858, 3507.923 , 3129.2798,\n",
       "       3194.    , 3173.8503, 3005.2825, 3080.5703, 2874.7397, 3054.5627,\n",
       "       2903.5781, 3097.4563, 3068.8008, 3003.8489, 3047.2852, 2787.7163,\n",
       "       2899.8467, 2824.1494, 3004.1438, 3168.5857, 3077.1128, 2943.9485,\n",
       "       2874.4685, 3079.9285, 2939.256 , 2974.9175, 2234.098 , 2746.1802,\n",
       "       2672.1453, 2777.9397, 2946.3406, 2674.9229, 2839.5312, 2858.7703,\n",
       "       2834.4392, 2746.8652, 2750.4463, 2670.8953, 2390.8806, 2928.7166,\n",
       "       2802.3699, 2628.5408, 2574.7832, 2658.7878, 2668.7185, 2481.0974,\n",
       "       2597.2126], dtype=float32)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "inv_yhat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "3314d790",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MAPE: 0.0819261\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn import metrics\n",
    "def mape(y_true, y_pred):\n",
    "    return np.mean(np.abs((y_pred - y_true) / y_true))\n",
    "print('MAPE:',mape(inv_y, inv_yhat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "1f9a9a20",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "R2-score: 0.6212322824268854\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import r2_score\n",
    "print('R2-score:',r2_score(inv_y, inv_yhat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "27b1d1c5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x225321907c0>]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(inv_yhat,'r')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "334e9396",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "inv_yhat=pd.DataFrame(data=inv_yhat)\n",
    "inv_yhat.to_csv('inv_y.csv')\n",
    "inv_yhat.to_csv('pu03_min_pre.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "776d1290",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
